// 递归实现完全深拷贝
function deepClone (obj) {
  let objClone = Array.isArray(obj) ? [] : {}
  if (obj && typeof obj === 'object') {
    for (key in obj) {
      if (obj.hasOwnProperty(key)) {
        if (obj[key] && typeof obj[key] === 'object') {
          try {
            objClone[key] = deepClone(obj[key])
          } catch {
            console.log('aa')
            // objClone[key] = obj[key]
          }
        } else {
          objClone[key] = obj[key]
        }
      }
    }
  }
  return objClone
}

// stringify和parse结合可以实现完全深拷贝
function deepCloneWithStringfy(obj){
  try {
    objClone = JSON.parse(JSON.stringify(obj)); 
    return objClone
  } catch {
    console.log('b')
  }
  
  
  
}  
// slice实现的并不是真正意义上的深拷贝，第一层确实不受影响，但是第二级等更深层的还是共用了地址
// 同slice一样，concat，filter等一些数组的操作都是如此
function CloneWithSlice (obj) {
  let objClone = Array.isArray(obj) ? [] : {}
  objClone = obj.slice()
  return objClone
} 

// $.extend( [deep ], target, object1 [, objectN ] )
// deep表示是否深拷贝，为true为深拷贝，为false，则为浅拷贝

// assign 也不是深拷贝，和slice等类似
function shallowClone (obj) {
  return Object.assign({}, obj)
}